// 接口

/*
1. Promise是一个类，执行这个类的时候需要传递一个执行器进去，执行器会立即执行
2. 调用resolve或者reject是在更改promise的状态
3. 三种状态
  1. 成功 fulfilled
  2. 失败 rejected
  3. 等待 pending
一旦状态确定就不可以更改！
resolve和reject是用来更改状态的！
resolve: fulfilled
reject: rejected
4. then方法内部做的就是判断状态 如果是成功调用成功回调函数 如果是失败调用失败回调函数 then
方法是被定义在原型对象中的
5. then成功回调有一个参数表示表示成功之后的值 then失败有一个失败原因的参数
*/
const MyPromise = require("./MyPromise");
let promise = new MyPromise((resolve, reject) => {
  // 模拟一下异步的操作
  // setTimeout(() => {
  //   // resolve("成功");
  //   reject("失败");
  // }, 0);
  // resolve("成功");
  reject("失败");
  // throw new Error("this is executor error");
});
function other() {
  return new MyPromise((resolve, reject) => {
    resolve("other");
  });
}
// 成功的值和失败的原因
// let p1 = promise.then((value) => {
//   console.log(value);
//   return p1;
// });
// 测试一下并行执行promise
// promise
//   .then((value) => {
//     console.log(value);
//     return other();
//   })
//   .then((value) => console.log(value));
// p1.then(
//   (value) => {
//     console.log(value);
//   },
//   (reason) => {
//     console.log(reason);
//   }
// );
// 测试一下捕获执行器的错误
// 捕捉一下上一个回调函数的错误
// promise
//   .then(
//     (value) => {
//       console.log(value);
//       // throw new Error("this is then error"); //this is then error
//       return "测试异步的pending";
//       // 测试异步的pending
//     },
//     (reason) => {
//       // console.log(reason.message); // this is executor error
//       // return 10000; // 必须得失败才能进的来
//     }
//   )
//   .then(
//     (value) => {
//       console.log(value);
//     },
//     (reason) => {
//       console.log(reason);
//     }
//   );
promise
  .then()
  .then()
  .then(
    (val) => console.log(val),
    (rea) => console.log(rea)
  );
